package sv.com.seguros.dao.asg;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import sv.com.seguros.dao.BaseDaoImpl;
import sv.com.seguros.dto.asg.AsgSeguimiento;
import sv.com.seguros.exception.WebException;
import sv.com.seguros.web.controller.asg.AsgSeguroForm;

public class AsgSeguimientoDaoImpl extends BaseDaoImpl implements AsgSeguimientoDao {

	@SuppressWarnings("unchecked")
	public List<Object[]> findAllByType(Long identifier, String type) throws WebException{
		try {
			DetachedCriteria criteria = DetachedCriteria.forClass(AsgSeguimiento.class);
			criteria.createAlias("asgContacto", "asgContacto", Criteria.INNER_JOIN);
			criteria.createAlias("asgContacto.ctgTipoContacto", "ctgTipoContacto", Criteria.INNER_JOIN);
			criteria.setProjection(Projections.projectionList().
					add(Projections.property("asgSeguimientoId")).
					add(Projections.property("asgSeguimientoFecha")).
					add(Projections.property("asgSeguimientoFechaSiguiente")).
					add(Projections.property("asgContacto.asgContactoNombre")).
					add(Projections.property("ctgTipoContacto.ctgCatalogoNombre")).
					add(Projections.property("asgSeguimientoDescripcion"))
			);
			if("reclamo".equalsIgnoreCase(type))
				criteria.add(Restrictions.eq("asgReclamo.asgReclamoId", identifier));
			else if("pendiente".equalsIgnoreCase(type))
				criteria.add(Restrictions.eq("asgPendiente.asgPendienteId", identifier));
			else if("venta".equalsIgnoreCase(type))
				criteria.add(Restrictions.eq("asgVenta.asgVentaId", identifier));
			criteria.addOrder(Order.desc("asgSeguimientoId"));
			return (List<Object[]>) findByCriteria(criteria);
		} catch (Exception e) {
			throw new WebException("Problemas tratar de obtener el detalle de seguimientos");
		}
	}

	@SuppressWarnings("unchecked")
	public List<AsgSeguimiento> findAllReclamoPendientesBy(AsgSeguroForm asgSeguroForm){
		try {
			DetachedCriteria criteria = DetachedCriteria.forClass(AsgSeguimiento.class);
			criteria.createAlias("asgReclamo", "asgReclamo", Criteria.INNER_JOIN);
			criteria.add(Restrictions.ne("asgReclamo.asgReclamoFinalizado", "1"));
			criteria.addOrder(Order.desc("asgReclamo.asgReclamoId"));
			criteria.addOrder(Order.desc("asgSeguimientoId"));
			return (List<AsgSeguimiento>) findByCriteria(criteria);
		} catch (Exception e) {
			logger.error("Exception", e);
		}
		return Collections.emptyList();
	}
	
	@SuppressWarnings("unchecked")
	public List<AsgSeguimiento> findAllPendientePendientesBy(AsgSeguroForm asgSeguroForm){
		try {
			DetachedCriteria criteria = DetachedCriteria.forClass(AsgSeguimiento.class);
			criteria.createAlias("asgPendiente", "asgPendiente", Criteria.INNER_JOIN);
			criteria.add(Restrictions.ne("asgPendiente.asgPendienteFinalizado", "1"));
			criteria.addOrder(Order.desc("asgPendiente.asgPendienteId"));
			criteria.addOrder(Order.desc("asgSeguimientoId"));
			return (List<AsgSeguimiento>) findByCriteria(criteria);
		} catch (Exception e) {
			logger.error("Exception", e);
		}
		return Collections.emptyList();
	}
	
	public void deleteAsgSeguimiento(Long asgSeguimientoId) throws Exception{
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("asgSeguimientoId", asgSeguimientoId);
		String hqlQuery = "delete from AsgSeguimiento where asgSeguimientoId = :asgSeguimientoId)";
		executeNonHibernateQuery(hqlQuery, parameters);
	}
	
}
